package com.wx.innerclass.chapter01;


import org.junit.Before;
import org.junit.Test;

/**
 * @description: 排序
 * 选择排序
 * 冒泡排序
 * 插入排序
 * @author: wangxun
 * @createDate: 2021/12/21
 * @version: 1.0
 */
public class Sort {

    private static int[] arr = {5,1,3,7,343,11,33,90,9};

    /**
     * 打印数组
     */
    private static void printArray(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println("");
    }
    /**
     * 交换数组中的值
     * @param arr 数组
     * @param: sourceIndex 源下标
     * @param: destIndex  目的下标
     * @return void
     * @author Wang.xun
     * @date 2021/12/21 12:20
     */
    private static void swap(int[] arr,int sourceIndex,int destIndex){
        int temp = arr[sourceIndex];
        arr[sourceIndex] = arr[destIndex];
        arr[destIndex] = temp;
    }

    @Before
    public void printAll(){
        System.out.printf("原有数组:");
        printArray(arr);
        System.out.println("------------");
    }

    /**
     * 选择排序
     * @param
     * @return void
     * @author Wang.xun
     * @date 2021/12/21 13:17
     */
    @Test
    public  void selectSort(){
        /**
         *  选择排序，第一次循环将比较两两值 ，最小的索引放到首位，
         *  每一次比较出最小值的索引，最后将最小值的放到最前面
         *
         */
        int length = arr.length;
        for (int i = 0; i < length; i++) {
            int minIndex = i;
            for (int j = minIndex+1 ; j < length; j++) {
                if(arr[minIndex] > arr[j]){
                   minIndex = j;
                }
            }
            swap(arr,i,minIndex);
        }
        printArray(arr);
    }
    /**
     * 冒泡排序
     * @param
     * @return void
     * @author Wang.xun
     * @date 2021/12/21 13:17
     */
    @Test
    public  void bubblingSort(){
        /**
         *  冒泡排序，第一次循环将比较两两值 ，小的值放到后面，依次再比较
         *  第一次循环之后，最小的值就在 最后面
         *
         */
        int length = arr.length;
        for (int i = 0; i < length; i++) {
            for (int j = i+1 ; j < length; j++) {
                if(arr[i] < arr[j]){
                    swap(arr,j,i);
                }
            }
        }
        printArray(arr);
    }

    /**
     * 插入排序
     * @param
     * @return void
     * @author Wang.xun
     * @date 2021/12/21 13:17
     */
    @Test
    public  void insertSort(){
        /**
         *  插入排序，相当于抓牌，手上的牌已经有顺序了 从小到大
         *  那么新抓上的一张牌，先跟它起始位置N N-1的位置比较 如果 arr[N] > arr[N-1]
         *  那么说明顺序正好，如果小于，那么就交换，并且再往前看，看比较前面的值，直到不满足或者索引到零
         *
         */
        int length = arr.length;

        for (int i = 1; i < length; i++) {

            // 当前位置的索引 要拿当前位置 和所有前面的元素比较，当小于前面的元素就换位置，不小于就停止，因为前面已经是有序的了，0的时候也要停止
            int currentIndex = i;
            for (int j = currentIndex ; j > 0 ; j--) {
                if(arr[j] < arr[j-1]){
                    swap(arr,j,j-1);
                }else{
                    break;
                }
            }
        }
        printArray(arr);
    }




    public static void main(String[] args) {
        printArray(arr);

    }

}
